package com.itany.shop.service.impl;

import com.itany.shop.dao.ProductDao;
import com.itany.shop.entity.Item;
import com.itany.shop.entity.Product;
import com.itany.shop.exception.ProductNotExistException;
import com.itany.shop.exception.RequestParameterErrorException;
import com.itany.shop.exception.UserNotLoginException;
import com.itany.shop.factory.ObjectFactory;
import com.itany.shop.service.CartService;
import com.itany.shop.util.ParameterUtil;
import com.itany.shop.vo.Cart;

import java.util.List;

/**
 * @author 石小俊
 * @date 2023年09月20日 16:00
 */
public class CartServiceImpl implements CartService {

    private ProductDao productDao = (ProductDao) ObjectFactory.getObject("productDao");

    @Override
    public void addCart(Cart cart, String id) throws UserNotLoginException, RequestParameterErrorException, ProductNotExistException {
        if (cart == null) {
            throw new UserNotLoginException("请先登录");
        }
        if (ParameterUtil.isNull(id)) {
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 由于商品的价格是浮动,可能会发生变化
        // 当前加入购物车的商品的价钱与已经存在于购物车中同一个商品的价钱可能不一样
        // 此时我们只考虑新加入购物车的商品的价钱变化,使用最新的价钱展示购物车数据
        // 在实际开发中一般在支付前进行二次查询

        // 根据加入购物车的商品编号,查询最新的商品信息
        Product product = productDao.selectById(Integer.parseInt(id));
        if (product == null) {
            throw new ProductNotExistException("该编号对应的商品不存在,请检查编号是否正确");
        }

        // 加入购物车有两种场景
        // 1.当前购物车中已经存在对应商品
        // 2.当前购物车中尚未存在对应商品
        // 不同的场景,业务处理也不一样
        // 根据当前购物车中明细信息,判断加入购物车的商品是否已经存在
        List<Item> items = cart.getItems();
        // 遍历这些明细
        for (Item item : items) {
            // 如果当前明细中商品主键与加入购物车中商品主键一致,则表示该商品已经存在
            if (item.getProduct().getId().equals(product.getId())) {
                // 此时的购物车发生哪些变化?
                // 1.明细数量=原来的明细数量+1
                item.setNum(item.getNum() + 1);
                // 在修改明细总价之前的总价属于原来的明细总价
                // 获取原来的明细总价
                Double oldPrice = item.getPrice();
                // 2.明细总价=当前明细数量*商品单价
                item.setPrice(item.getNum() * product.getPrice());
                // 在修改明细总价之后的总价属于现在的明细总价
                // 获取现在的明细总价
                Double newPrice = item.getPrice();
                // 3.购物车总价=原来的购物车总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice() - oldPrice + newPrice);
                return;
            }
        }

        // 如果明细中不存在对应商品,此时的购物车发生哪些变化?
        // 1.新增了一条明细信息
        Item item = new Item();
        // 新增的明细数量=1
        item.setNum(1);
        // 新增的明细总价=商品单价
        item.setPrice(product.getPrice());
        // 新增的商品就是当前商品
        item.setProduct(product);
        // 将新增的明细添加到购物车中
        cart.addItem(item);
        // 2.购物车总价=原来的购物车总价+当前明细的总价
        cart.setPrice(cart.getPrice() + item.getPrice());

    }

    @Override
    public void removeCart(Cart cart, String id) throws UserNotLoginException, RequestParameterErrorException {
        if (cart == null) {
            throw new UserNotLoginException("请先登录");
        }
        if (ParameterUtil.isNull(id)) {
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 找到需要删除的明细是哪一个
        List<Item> items = cart.getItems();
        for (int i = 0; i < items.size(); i++) {
            // 取出迭代的元素
            Item item = items.get(i);
            // 判断该元素是否是需要被删除的明细
            if (item.getProduct().getId().equals(Integer.parseInt(id))) {
                // 此时购物车发生哪些变化?
                // 1.购物车总价=原来的总价-当前明细总价
                cart.setPrice(cart.getPrice() - item.getPrice());
                // 2.移除购物车中指定明细
                cart.removeItem(item);
            }
        }
    }

    @Override
    public void modifyCart(Cart cart, String id, String num) throws UserNotLoginException, RequestParameterErrorException {
        if (cart == null) {
            throw new UserNotLoginException("请先登录");
        }
        if (ParameterUtil.isNull(id) || ParameterUtil.isNull(num)) {
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 查询指定商品的最新信息
        Product product = productDao.selectById(Integer.parseInt(id));

        // 取出购物车中所有明细
        List<Item> items = cart.getItems();
        // 遍历明细
        for (Item item : items) {
            // 找出需要修改的明细是谁
            if (item.getProduct().getId().equals(product.getId())) {
                // 购物车发生哪些变化?
                // 1.明细数量=num
                item.setNum(Integer.parseInt(num));
                Double oldPrice = item.getPrice();
                // 2.明细总价=当前商品的单价*当前明细数量
                item.setPrice(product.getPrice() * item.getNum());
                Double newPrice = item.getPrice();
                // 3.购物车总价=原来的总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice() - oldPrice + newPrice);
            }
        }

    }
}
